#pragma once

// 类型萃取主要是一些通用算法中需要获取list<T>中T的类型而设计的，是一个中间层，让算法具有通用性


template <typename _Iterator>
struct IteratorTraits
{
    typedef typename _Iterator::valueType  valueType; // 这样就可以获取迭代器操作的数据类型
    typedef typename _Iterator::pointer    pointer;
    typedef typename _Iterator::reference  reference;
};


// 因为像vector这样的容器，其迭代器就是一个普通的指针，而不是类，所以需要特化模板
template <typename _Tp>
struct IteratorTraits<_Tp*>
{
    typedef _Tp  valueType; // 这样就可以获取迭代器操作的数据类型
    typedef _Tp*    pointer;
    typedef _Tp&  reference;
};

template <typename _Tp>
struct IteratorTraits<const _Tp*>
{
    typedef _Tp  valueType; // 这样就可以获取迭代器操作的数据类型
    typedef _Tp*    pointer;
    typedef _Tp&  reference;
};

template <typename T>
struct isPointer {
    static const bool value = false;
};

template <typename T>
struct isPointer<T*> {
    static const bool value = true;
};

